/*
 * @desc include functions that shared by all things in the systems such as project, module, action
 */

/**
 * @desc action when enter
 * @author vinhnv (vinhnv@vnext.vn)
 * @since 2011/08/08
 * @other must add element "input" with type="text", id="antiAutoSubmit" and style="display:none" into "form"
 * @use onkeydown="enter(event, 'cal()')"
 */
function enter(e, func) {
    if(typeof func == 'undefined' || typeof func == null ) {
        func = '';
    }
    var keynum;
    if(window.event) { // IE
        keynum = e.keyCode;
    }
    else if(e.which) { // Netscape/Firefox/Opera
        keynum = e.which;
    }
    if(keynum == 13) {
        if(func.search(/,/g) == -1) {
            if(func.search(/\([ ]*\)/g) == -1) { // have at least one paramter
                func = func.replace(/\)[^\)]*$/g, ", e);");
            } else { // has a paramter
                func = func.replace(/\)[^\)]*$/g, "e);");
            }
        } else { // has not any a parameter
            func = func.replace(/\)[^\)]*$/g, ", e);");
        }
        eval(func);
        return false; // execute action
    }else {
        return true; // accept characters
    }
}

/**
 * @desc check keydown is enter
 * @author vinhnv (vinhnv@vnext.vn)
 * @since 2011/08/08
 * @other must add element "input" with type="text", id="antiAutoSubmit" and style="display:none" into "form"
 */
function isEnter(e) {
    var keynum;
    if(window.event) { // IE
        keynum = e.keyCode;
    }
    else if(e.which) { // Netscape/Firefox/Opera
        keynum = e.which;
    }
    if(keynum == 13) {
        return true; // is Enter
    } else {
        return false; // no
    }
}
/**
   * @desc confirm using jquery ui
   * @author vinhnv@vnext.vn
   * @since 2011/08/19
   */
function jConfirm(title, content, funcOK, funcCancel) {
    if($('#dialog').length == 0) {
        $('body').append($('<div id="dialog" ></div>'));
    }
    if(typeof(funcOK) != 'string') {
        funcOK = '';
    }
    if(typeof(funcCancel) != 'string') {
        funcCancel = '';
    }
    $("#dialog").dialog({
        autoOpen: false,
        position: ['center', 'center'],
        modal: true,
        buttons: {
            "OK": function() {
                $(this).dialog("close");
                eval(funcOK);
            },
            "キャンセル": function() {
                $(this).dialog("close");
                eval(funcCancel);
            }
        }
    });
    $("#dialog").html(content);
    $("#dialog").dialog({
        title: title
    });
    $("#dialog").dialog("open");
}

/**
 * @desc Gán action và kiểm tra trường bắt buộc nhập
 * @author vinhnv@vnext.vn
 */
function validatePinkFields(pinkFields, checkPinkHandler, autoCheck) {
    // Khai báo biến
    var i; // biến duyệt mảng
    
    // Kiểm tra lại danh sách trường validate
    typeof pinkFields != 'object' || pinkFields == undefined ? pinkFields = []: null;
    
    // Kiểm tra lại hàm xử lý
    typeof checkPinkHandler != 'function' || checkPinkHandler == undefined ? checkPinkHandler = function(){}: null;
    
    // Kiểm tra xem có tự động tự động kiểm tra hay không
    typeof autoCheck != 'boolean' || autoCheck == undefined ? autoCheck = true : null;
    
    // Gán xử lý sự kiện
    for(i in pinkFields) {
        $('#' + pinkFields[i]).live(
            'change',
            {
                id: pinkFields[i]
            },
            checkPinkHandler
            );
    }
    if(autoCheck) {
        // Chạy 1 lần xử lý sự kiện
        for(i in pinkFields) {
            checkPink(pinkFields[i]);
        }
    }
}
/**
 * @desc Xử lý trường có rỗng hay không
 * @param eventObject hoặc là eventObject hoặc id (string) của đối tượng muốn kiểm tra
 * @author vinhnv@vnext.vn
 */
function checkPink(eventObject) {
    // Khai báo biến
    var target;
    
    // Lấy đối tượng phát sinh event
    target = getTarget(eventObject);
    // Nếu rỗng thì coi tham số truyền vào là id
    $.isEmptyObject(target) ? target = $('#' + eventObject).first() : null;
    // Nếu rỗng thì đảm bảo chắc chắn đối tượng rỗng
    $.isEmptyObject(target) ? target = {} : null;
    if($(target).val() == '') {
        $(target).addClass('pink');
    } else {
        $(target).removeClass('pink');
    }
}
/**
 * @desc get target
 * @author vinhnv@vnext.vn
 */
function getTarget(eventObject) {
    // Nếu null được truyền vào thì trả về đối tượng rỗng
    if(eventObject == null) {
        return {};
    }
    return eventObject.target ? eventObject.target : (eventObject.srcElement ? eventObject.srcElement : {});
}
/**
 * @desc bind array into string, format index string => value
 * @author vinhnv@live.com
 */
function bindJs($string, $array, $bracket) {
    var obj, i;
    
    typeof $bracket == 'undefined' ? $bracket = {} : null;
    typeof $bracket.OPEN_BRACKET == 'undefined' ? $bracket.OPEN_BRACKET = '{' : null;
    typeof $bracket.CLOSE_BRACKET == 'undefined' ? $bracket.CLOSE_BRACKET = '}' : null;
    
    obj = $bracket;
    for(i in obj) {
        if(typeof i != 'string') {
            continue;
        }
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    
    obj = $array;
    for(i in obj) {
        if(typeof i != 'string') {
            continue;
        }
        svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    
    var $opens = $string.split(OPEN_BRACKET); // split each element at format: ..{string}.... => string}....
    if($opens.length > 1) { // if there has character '{'
        for(var $ondex in $opens) { // browse each element 
            $open = $opens[$ondex];
            var $closes = $open.split(CLOSE_BRACKET); // split each element string}.... => string...        
            if($closes.length > 1) {
                eval('$closes[0] = ' + $closes[0]); // replace by value
                $opens[$ondex] = $closes.join(''); // compositing parts
            }
        }
        $string = $opens.join('');  // compositing parts
    }
    return $string;
}
/**
 * @desc show dialog base config
 * @param {'id':id, 'html': html, ...}
 * @author vinhnv@vnext.vn
 */
function openDialog(optionObj, eventConfigObj, userConfigObj) {
    // Khởi tạo biến
    var newEventConfigObj;
    
    typeof eventConfigObj == 'object' ? null : eventConfigObj = {};
    typeof userConfigObj == 'object' ? null : userConfigObj = {};
    var defaultConfigObj = {
        // for config obj
        id: '',
        // Hủy overlay khi đóng, mặc định không làm gì
        destroyOnClose: false,
        // for jquery dialog option
        disabled:false,
        autoOpen:true,
        buttons:{ },
        closeOnEscape:true,
        closeText:'close',
        dialogClass:'',
        draggable:true,
        height:'auto',
        hide:null,
        maxHeight:false,
        maxWidth:false,
        minHeight:150,
        minWidth:150,
        modal:false,
        position:'center',
        resizable:true,
        show:null,
        stack:true,
        title:'',
        width:300,
        zIndex:1000
    };
    var obj = defaultConfigObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    obj = optionObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    var finalConfigObj = {
        disabled:disabled,
        autoOpen:autoOpen,
        buttons:buttons,
        closeOnEscape:closeOnEscape,
        closeText:closeText,
        dialogClass:dialogClass,
        draggable:draggable,
        height:height,
        hide:hide,
        maxHeight:maxHeight,
        maxWidth:maxWidth,
        minHeight:minHeight,
        minWidth:minWidth,
        modal:modal,
        position:position,
        resizable:resizable,
        show:show,
        stack:stack,
        title:title,
        width:width,
        zIndex:zIndex
    };
    id = getDialogId(id);
    selector = '#' + id;
    if($(selector).length == 0) {
        $('body').append('<div id="' + id + '"></div>');
    }
    
    // Chỉ khi truyền tham số html thì mới thay thế nội dung
    // Ngược lại sử dụng cái đã có
    if(typeof html != 'undefined') {
        $(selector).html(html);
    }
    
    // Nếu hủy dialog khi đóng, thì bind thêm handler vào close event
    // Hủy dialog trước
    if(destroyOnClose == true ) { 
        
        // Xác nhận kiểu
        typeof eventConfigObj == 'object' && eventConfigObj != null ? null : eventConfigObj = {};
        typeof eventConfigObj.close == 'function' ? null : eventConfigObj.close = function() {};
        
        // Tạo event object không có close event handler
        newEventConfigObj = $.extend({}, eventConfigObj);
        // Loại bỏ event handler close
        newEventConfigObj.close = null;
        delete(newEventConfigObj.close);

        // Nhập event config
        finalConfigObj = $.extend({}, finalConfigObj, newEventConfigObj);
        
        // bind handler hủy dialog trước khi đóng
        $( selector ).bind( "dialogclose", function(event, ui) {
            
            // Thực hiện callback
            eventConfigObj.close(event, ui);

            // Hủy dialog
            $(selector).html('');
            $(selector).dialog("destroy");

        });
        
    } else {
        
        // Nhập event config
        finalConfigObj = $.extend({}, finalConfigObj, eventConfigObj);
        
    };
    
    // Truyền tham số
    $(selector).dialog(finalConfigObj);
    
    // Mở dialog
    $(selector).dialog("open");
    
}
function getDialogId(id) {
    return id = 'dialog-' + id;
}
/**
 * @desc close dialog base config
 * @param {'id':id, 'html': html, ...}
 * @author vinhnv@vnext.vn
 */
function closeDialog(optionObj) {
    var defaultConfigObj = {
        // for config obj
        id: ''
    };
    var obj = defaultConfigObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    obj = optionObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    id = getDialogId(id);
    selector = '#' + id;
    $(selector).dialog("close");
}
/**
 * @desc close dialog base config
 * @param {'id':id, 'html': html, ...}
 * @author vinhnv@vnext.vn
 */
function destroyDialog(optionObj) {
    var defaultConfigObj = {
        // for config obj
        id: ''
    };
    var obj = defaultConfigObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    obj = optionObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    id = getDialogId(id);
    selector = '#' + id;
    $(selector).dialog("destroy");
}

/**
 * @desc Kiểm tra dialog có đang mở hay không
 * @param {'id':id, 'html': html, ...}
 * @author vinhnv@vnext.vn
 */
function isOpenDialog(optionObj) {
    var defaultConfigObj = {
        // for config obj
        id: ''
    };
    var obj = defaultConfigObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    obj = optionObj;
    for(var i in obj) {
        var svar = '';
        eval("typeof " + i + " == 'undefined' ? svar = 'var' : svar = '';");
        eval(svar + ' ' + i + '=obj[i];');
    } // extra attribute into variables
    id = getDialogId(id);
    selector = '#' + id;
    // Trong trường hợp chưa mở giá trị trả về có thể là true hoặc 1 đối tượng
    return $(selector).dialog("isOpen") === true;
}

/**
 * @desc clear data form 
 * 
 * @author sonhh@vnext.vn
 * @since 2012/03/14
 */
function clearDataForm(ele){        
    $("#"+ele).find(':input').each(function() {
        switch(this.type) {
            case 'password':
            case 'select-multiple':
            case 'select-one':
            case 'text':
            case 'textarea':
                $(this).val('');
                break;
            case 'checkbox':
            case 'radio':
                this.checked = false;
        }
    });

}
/**
 * @desc bật chế độ menu sổ xuống
 * @param object:đối tượng click,list_items:đối tượng cần sổ xuống
 * @author sonhh@vnext.vn
 */
function toogleMenu(element,list_items,object){  
    if(typeof object === "string" && typeof object !== undefined){
        var booleans = $.cookie(object);        
        if(booleans == 'false'){			
	$("#"+element).removeClass("menu-down");
	$("#"+element).addClass("menu-horizontal");
	$('#'+list_items).hide();
        }else{
	$('#'+list_items).show();
	$("#"+element).removeClass("menu-horizontal");
	$("#"+element).addClass("menu-down");
        }   
    }  
    $("#"+element).live('click', function(e) {
        if($('#'+list_items).css('display') == 'none'){
	$.cookie(object,'true');	
	$('#'+list_items).show();
	$("#"+element).removeClass("menu-horizontal");
	$("#"+element).addClass("menu-down");
        } else {	
	$.cookie(object,'false');	
	$("#"+element).removeClass("menu-down");
	$("#"+element).addClass("menu-horizontal");
	$('#'+list_items).hide();
        }

    });    
}

/**
 * @desc Đổ dữ liệu vào input
 * @param $objData Đối tượng dữ liệu ('field' => value, ....)
 * @param $table tên bảng muốn đổ
 * @param $index đối tượng thứ mấy được đổ của bảng
 * @return không trả gì
 * @result Dữ liệu input được đổ đúng
 * @author vinhnv (vinhnv@vnext.vn)
 * @since 2012/03/26
 */
function pushDataIntoInput($objData) {
    // Khởi tạo biến
    // Biến duyệt mảng
    var $field;
    var $tagName;
    // Đảm bảo đối tượng được truyền vào
    $.isEmptyObject($objData) ? $objData = {} : null;
    
    for($field in $objData) {
        // Dữ liệu của trường
        $value = $objData[$field];
        
        // Tùy từng trường mà đổ theo cách khác nhau
        switch(true) {
            // Mặc định là đổ trực tiếp
            default:
                // Xác định đổ giá trị hay html
                $tagName = $('#' + $field).prop('tagName');
                typeof $tagName == 'undefined' ? $tagName = '' : null;
                switch(true) {
                    // Gán giá trị cho radio (gồm thuộc tính checked và value)
                    case $tagName == 'INPUT' && $('#' + $field).is(':radio'):
                        // Lấy thuộc tính checked
                        $checked = $value.checked == 1 ? 1 : 0;
                        // Lấy value cho radio
                        $val = $value.value;
                        $('#' + $field).prop('checked', $checked);
                        !!$val ? $('#' + $field).val($val) : null;
                        break;
                    // Gán giá trị cho checkbox (chỉ có mỗi thuộc tính checked)
                    case $tagName == 'INPUT' && $('#' + $field).is(':checkbox'):
                        $value == 1 ? $value = true : $value = false;
                        $('#' + $field).prop('checked', $value);
                        break;
                    // Gán giá trị
                    case $tagName == 'INPUT':
                    case $tagName == 'SELECT':
                    case $tagName == 'TEXTAREA':
                        // Gán giá trị
                        switch(true) {
                            case typeof $value == 'string':
                            case typeof $value == 'number':
                            case typeof $value == 'boolean':
                                // Nếu là những giá trị cơ bản thì gán trực tiếp
                                $('#' + $field).val($value);
                                break;
                            default:
                                // Nếu không là những giá trị cơ bản thì gán trắng
                                $('#' + $field).val('');
                                break;
                        }
                        break;
                    // Gán html
                    default:
                        // Gán html
                        switch(true) {
                            case typeof $value == 'string':
                            case typeof $value == 'number':
                            case typeof $value == 'boolean':
                                // Nếu là những giá trị cơ bản thì gán trực tiếp
                                $('#' + $field).html($value);
                                break;
                            default:
                                // Nếu không là những giá trị cơ bản thì gán trắng
                                $('#' + $field).html('');
                                break;
                        }
                        break;
                }
                break;
        }
    }
}
/**
 * @desc có tác dụng giống như hàm htmlentities trong PHP
 * @param $html chuỗi có chứa các ký tự ứng dụng ví dụ <>/
 * @return trả về chuỗi đã được mã hóa htmlentities
 * @author vinhnv (vinhnv@vnext.vn)
 * @since 2012/03/26
 */
function htmlEntities($html) {
    if($html == null) {
        return '';
    }
    return $('<div />').text($html).html();
}
/**
 * @desc có tác dụng ngược với hàm htmlEntities
 * @param $encodedHtml chuỗi chứa htmlentities thành ký tự ứng dụng ví dụ &lt; => '<', &gt; => '>'
 * @return trả về chuỗi chứa các ký tự ứng dụng
 * @author vinhnv (vinhnv@vnext.vn)
 * @since 2012/03/26
 */
function decodeHtmlEntities($encodedHtml) {
    return $('<div />').html($encodedHtml).text();
}

// element đang được focus
var active_element;
// Cờ xác định trình duyệt là IE
var bIsMSIE;

//
var delayHideSearchingMsg = 1000;
/**
 * @desc blur & đóng cửa sổ
 * @link http://pro-thoughts.blogspot.com/2006/10/incorrect-behavior-of-windowonblur.html
 * @guide <body onload="initiateSelfClosing()">
 * @author vinhnv@vnext.vn
 * @since 2012/04/07
 */
function initiateSelfClosing() {
    // Nếu là ie, đối tượng onblur là document
    if (navigator.appName == "Microsoft Internet Explorer") {
        active_element = document.activeElement;
        document.onfocusout = closeWnd;
        bIsMSIE = true;
    }
    // Ngược lại, sẽ là window
    else {
        window.onblur = closeWnd;
    }
}
/**
 * @desc Chịu trách nhiệm đóng màn hình khi blur window
 * @author vinhnv@vnext.vn
 * @since 2012/04/07
 */
function closeWnd() {
    // Nếu cửa sổ được mở bởi cửa sổ khác
    if (window.opener != null) {
        // Nếu là ie và nơi focus cùng màn hinh thì không làm gì
        // Sự kiện onfocusout của document phát sinh khi không focus element hiện tại (bao gồm sang cửa sổ khác)
        // Chuyển sang cửa sổ khác thì activeElement không thay đổi
        // Ngược lại, trong cùng cửa sổ thì activeElement đã thay đổi
        if (bIsMSIE && active_element != document.activeElement) {
            active_element = document.activeElement;
        }
        else {
            window.close();
        }
    }
}
/**
 * @desc Kiểm tra chuỗi năm/tháng/ngày có tồn tại không
 * @param dateString chuỗi năm/tháng/ngày vs '2012/02/12'
 * @author vinhnv@vnext.vn
 * @since 2012/04/19
 */

function isValidDate(dateString) {
        var newDateString = '';
        // Tạo đối tượng date
        var date = new Date(dateString);
        
        // Lấy thông tin ngày tháng năm
        var year = '' + date.getFullYear();
        var month = '' + (date.getMonth() + 1);
        var day = '' + date.getDate();
        
        // Xác nhận độ dài thông tin
        month.length == 1 ? month = '0' + month : null;
        day.length == 1 ? day = '0' + day : null;
        
        // Xác nhận thông tin năm/tháng/ngày
        newDateString = year + '/' + month + '/' + day;
        
        // Kiểm tra ngày có tồn tại hay không
	return newDateString == dateString;
}

function randomString() {
    return '' + new Date().getTime();
}

function ajax(module, action, callbackFuncSuccess, param) {
    // build url to action
    var url = ROOT_URL + "/index.php/" + module + "/index/" + action;
    var data = "";
    if (param != undefined) data = param;
    
    // start request to server
    $.ajax({
        type: "POST",
        url: url,           
        data: data,
        dataType: 'json',
        success: function(data) { 
            if (callbackFuncSuccess != undefined) callbackFuncSuccess(data);
        }
    });
}
/**
 * @desc sử dụng editor bằng thư viện tinycme
 * @author sonhh <sonhh@vnext.vn>
 * @since 2012/04/07
 * @params: listElement:các element sẽ được sử dụng.Ví dụ về cách khai báo sử dụng:editor("issue_content_ask_html,issue_content_answer"); 
 */
function editor(listElement, module,listEleValidator){
    var focusInput;
    // lấy các element đang được focus
    $('input').focus(function(eventObject){
	focusInput = getTarget(eventObject);        
    });
    if(module == 'Issue'){
	var line_1 = "bold,forecolor,fontsizeselect";
    } else if(module == 'FAQ'){
	line_1 = "bold,italic,underline,|,formatselect,fontsizeselect,|,forecolor,backcolor,|,sub,sup,|,undo,redo,|,outdent,indent";
	var line_2 = "bullist,numlist,|,justifyleft,justifycenter,justifyright,justifyfull,|,removeformat,visualaid,|,link,image,code";
    }
    if(jQuery.type(listElement) === "string"){
	// khoi tạo tinymce để sử dụng
	tinyMCE.init({
	    // set height for textarea
	    height : 160,
	    // chế độ sử dụng- mode:exact: chỉ áp dụng cho những texarea co ID xác định được khai báo trong elements ở dưới
	    // nếu khai báo mode:textarea thì sẽ áp dụng cho toàn bộ tag texarea trong templates
	    mode : "exact",
	    // các element sẽ sử dụng tinymce trong templates
	    elements : listElement,
	    // khai báo sử dụng theme trong thư mục:tinymce/jscripts/tiny_mce/themes/advanced
	    theme : "advanced",
	    // Theme options
	    // khai báo các  button sẽ được sử dụng
	    theme_advanced_buttons1 : line_1,
	    theme_advanced_buttons2 : line_2,
	    // định dạng toolbar sẽ được hiển thị
	    theme_advanced_toolbar_location : "top",
	    theme_advanced_toolbar_align : "left",	
	    // định dạng font-size sẽ được sử dụng
	    theme_advanced_font_sizes: "10px,12px,14px,16px,18px,20px,24px,28px",	
	    apply_source_formatting : true,
	    force_br_newlines : true,
	    force_p_newlines : false,
	    forced_root_block : '', // Needed for 3.x,
	    convert_urls : false, // quynhcv - Tránh trường hợp url bị convert
	    //	relative_urls: true, remove_script_host : false, init_instance_callback : "setFontsInWysiwig",
	    // xử lý sự kiện khi click vào nôi dụng của iframe
	    setup : function(ed) {	
		ed.onClick.add(function(ed) {
		    // remove focus trong datepicker
		    $( focusInput ).datepicker('hide');
		});
		ed.onChange.add(function(ed) {
		    // kiem tra validator	        
		    validateEditor(ed,listEleValidator);
		});
		ed.onInit.add(function(ed) {
		    checkColorEditor(ed,listEleValidator);
		});

	    }	    
	});


	
    }    
}
function setFontsInWysiwig(instance) {           
    // Sets some contents to the current selection in the editor
    var editorId = instance.editorId;        
    Dom = tinyMCE.DOM;          
    Dom.setAttrib(editorId + '_fontsizeselect', 'aria-valuenow', '12px');
    
    
}
/**
 * @desc check validator editor khi nguoi dung nhap du lieu vao
 * @author sonhh <sonhh@vnext.vn>
 * @since 2012/05/15
 * @params: listElement:các element sẽ được sử dụng.Ví dụ về cách khai báo sử dụng:listEleValidator("issue_content_ask_html,issue_content_answer"); 
 */
function validateEditor(ed,listEleValidator){
    var editorId = ed.editorId; 
    if(typeof listEleValidator === "string"){
	var ary_Element = listEleValidator.split(',');
	if(ary_Element.length > 0){	    
	    for(var i = 0;i < ary_Element.length;i++){		
		if(editorId == ary_Element[i]){		    
		    var data = tinyMCE.get(ary_Element[i]).getContent();		
		    if($.trim(data)  == ""){
			var editor = tinyMCE.getInstanceById(ary_Element[i]);		    
			editor.getBody().style.backgroundColor = "#FAE3CF";
		    }else{
			var editor = tinyMCE.getInstanceById(ary_Element[i]);		    
			editor.getBody().style.backgroundColor = "#fff";
		    }
		}
		
	    }
	}
    }    
}
/**
 * @desc check color khi khoi tao
 * @author sonhh <sonhh@vnext.vn>
 * @since 2012/05/15
 * @params: listElement:các element sẽ được sử dụng.Ví dụ về cách khai báo sử dụng:listEleValidator("issue_content_ask_html,issue_content_answer"); 
 */
function checkColorEditor(ed,listEleValidator){
        
    if(typeof listEleValidator === "string"){
	var ary_Element = listEleValidator.split(',');
	if(ary_Element.length > 0){
	    for(var i = 0;i < ary_Element.length;i++){				
		var data = tinyMCE.get(ary_Element[i]).getContent();		
		if($.trim(data)  == ""){
		    var editor = tinyMCE.getInstanceById(ary_Element[i]);		    
		    editor.getBody().style.backgroundColor = "#FAE3CF";
		}
	    }
	}
    }    
}
// -->
/**
 * @desc Xử lý lỗi (khi dùng ajax) nếu có
 * @param data jqXHR từ server trả về
 * @author tuyendn@vnext.vn
 * @modifer vinhnv@vnext.vn
 * @since 2012/04/24
 */
function completeHandler(data) {
    
    // Khởi tạo biến
    var responseText = data.responseText;
    var obj = jQuery.parseJSON(responseText);
    
    // Chỉ redirect khi mà intIsOk tồn tại và có giá trị lỗi và có url redirect
    // Phòng trường hợp quên trả về intIsOk
    if (obj != null && obj.intIsOk != null && obj.intIsOk != 1 && obj.redirect_url != null) {
        
        // Redirect
        window.location.href = obj.redirect_url;
        
        // Dừng thực thi js và thông báo đang chuyển hướng
        throw 'redirecting';
    }
}
/**
 * @desc Xử lý session timeout
 * @param data jqXHR từ server trả về
 * @author tuyendn@vnext.vn
 * @modifer vinhnv@vnext.vn
 * @since 2012/04/24
 */
$('<div></div>').ajaxSuccess(function(event, xhr) {
    // Khởi tạo biến
    var responseText = xhr.responseText;
    var obj = jQuery.parseJSON(responseText);
    
    // Chỉ redirect khi mà intIsOk tồn tại và có giá trị lỗi và có url redirect
    // Phòng trường hợp quên trả về intIsOk
    if (obj != null && obj.intIsOk != null && obj.intIsOk != 1 && obj.redirect_url != null) {
        
        // Redirect
        window.location.href = obj.redirect_url;
        
        // Dừng thực thi js và thông báo đang chuyển hướng
        throw 'redirecting';
    }
}).appendTo('body')

/**
 * @desc fire event
 * @author vinhnv@vnext.vn
 * @since 2012/07/14
 */
function fireEvent(element,event){
    typeof element == 'object' && element != null ? null : element = null;
    if(null == element) {
        return;
    }
    try {
        if (document.createEventObject){
            // dispatch for IE
            var evt = document.createEventObject();
            return element.fireEvent('on'+event,evt)
        }
        else {
            // dispatch for firefox + others
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent(event, true, true ); // event type,bubbling,cancelable
            return !element.dispatchEvent(evt);
        }
    }
    catch(e) {}
}

/**
 * Function show dialog edit information of member login
 * 
 * @author : quynhcv@vnext.vn
 * @since : 2012/07/06
 */
function showDialogEditInformationMember(){
    this.ajax('default', 'showdialogmemberlogin', function(data){
        try{
            if(data.intIsOk == 1){
                var configOption = {
                    // for config obj
                    id: 'edit-information-member',
                    autoOpen: false,
                    draggable: true,
                    position: 'center',
                    closeOnEscape: true,
                    height: 'auto',
                    modal: true,
                    width: 'auto',
                    resizable: false,
                    title:'個人設定',
                    html: data.html
                };
                openDialog(configOption);
            }
        }catch(e){
            alert(e);
            return false;
        }
    });
    
}

/**
 * Function edit information of member login
 * 
 * @author : quynhcv@vnext.vn
 * @since : 2012/07/06
 */
function editInformationMemberLogin(){
    var param = '';
    if($('#member_password_change').length > 0)
        param = 'member_password=' + encodeURIComponent( $('#member_password_change').val() );
    if($('#member_password_confirm_change').length > 0)
        param += '&member_password_confirm=' + encodeURIComponent( $('#member_password_confirm_change').val() );
    this.ajax('default', 'editinformationmemberlogin', function(data){
        try{
            if(data.intIsOk != 1){
                alert(data.errors);
            }else{
                alert('登録しました。');
                closeDialog({id : 'edit-information-member'});
            }
        }catch(e){
            alert(e);
            return false;
        }
    }, param);
}
/*
 * IME - switch (for IE)
 * @author: Sonh
 * @since 2012/08/24
 * @param activeState: 'active' && 'inactive'
 * @param listField: array or string splitted by commas
 */
function imeSwitch(listField,activeState){
    
    try{
        if( typeof listField === 'undefined' || typeof  activeState === "undefined"){
            return;
        }
        var fields = new Array();
        if($.isArray(listField)){
            fields = listField;
        }else{
            fields = listField.toString().split(",");
        }  
        
        if(activeState != "active" && activeState != "inactive" && activeState != "disabled"){            
            return;
        }
        
        for (var k in fields){
            // Check if element is not existed
            if($("#"+fields[k]) != undefined  && $("#"+fields[k]).length > 0){

                $("#"+fields[k]).attr('style', "ime-mode:"+activeState);                    
            }
        }
    }catch(e){
            alert(e.message);
    }
}
/*
 * break line 
 * @author: Sonhh<sonhh@vnext.vn>
 * @since 2012/09/24 
 */
function nl2br (str, is_xhtml) {
    // Converts newlines to HTML line breaks      
    // *     example 1: nl2br('Kevin\nvan\nZonneveld');    // *     returns 1: 'Kevin\nvan\nZonneveld'
    // *     example 2: nl2br("\nOne\nTwo\n\nThree\n", false);
    // *     returns 2: '<br>\nOne<br>\nTwo<br>\n<br>\nThree<br>\n'
    // *     example 3: nl2br("\nOne\nTwo\n\nThree\n", true);
    // *     returns 3: '\nOne\nTwo\n\nThree\n'    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '' : '<br>';
    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '' : '<br>';
    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
}
/*
 * strip tag
 * @author: Sonhh<sonhh@vnext.vn>
 * @since 2012/09/26
 */
function strip_tags (input, allowed) {
    // Strips HTML and PHP tags from a string      
    allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
    var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
        commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
    return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {        return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
    });
}
